﻿namespace BlogsAPI.BlogsYandex
{

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Net;
    using System.Threading;
    using System.Diagnostics;

    /// <summary>
    /// Класс для обработки списка всех рускоязычных твитерян на Яндексе
    /// </summary>
    public class TopLJ : Abstract.WebInterface
    {
        private string _sUrl = "https://blogs.yandex.ru/top/lj/?page={0}";

        private readonly Regex _rNames = new Regex(@"class\W+name-container[^<]+<a href\W+[^>]+?/([-\w]+)\.livejournal\.com\W",
            RegexOptions.Compiled | RegexOptions.IgnoreCase);

        /// <summary>
        /// Загружаем общим списком все аккаунты
        /// </summary>
        /// <returns></returns>
        public List<string> LoadAll(int startpage, int endpage)
        {
            List<string> oRet = new List<string>(0);
            
            HttpWebRequest myHttpWebRequest;
            HttpWebResponse myHttpWebResponse;
            try
            {
                for (int page = startpage; page <= endpage; page++) // 50 тыс ограничение...
                {
                    Debug.WriteLine("page = " + page.ToString());
                    try
                    {
                        myHttpWebRequest = MakeRequest(String.Format(_sUrl, page));
                        myHttpWebRequest.Method = "GET"; // метод GET
                        myHttpWebRequest.Referer = "http://blogs.yandex.ru";
                        //получаем ответ и его разбираем...
                        myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                        string result = new StreamReader(myHttpWebResponse.GetResponseStream(),
                            Encoding.UTF8).ReadToEnd();
                        myHttpWebResponse.Close();
                        //есть ответ, надо его пропарсить..
                        //проверим, если там вообще то, что надо..
                        if (!String.IsNullOrEmpty(result))
                        {
                            MatchCollection mc = _rNames.Matches(result);
                            if (mc.Count > 0)
                            {
                                foreach (Match m in mc)//перебираем всех пользователей
                                {
                                    string name = m.Groups[1].ToString().ToLower();
                                    if (!oRet.Contains(name))
                                    {
                                        oRet.Add(name.Replace("-","_"));
                                    }
                                }
                            }
                            else
                            {
                                break;
                            }
                        }
                        Thread.Sleep(5000);
                    }
                    catch (WebException we)//like Timeout
                    {
                        Debug.WriteLine(we.Message);
                        page--;
                        Thread.Sleep(30000);
                    }                    
                }
            }
            catch (Exception e1)
            {
                Debug.WriteLine(e1.Message);
            }
            return oRet;
        }
    }
}
